Tree Shaking
Bundlerがbundleする過程で不要なコードを取り除く
本当に利用されているコードだけを残すことで、bundle sizeを小さくする
Rollup.jsで初めて登場して、Webpackもv2から入った
その後、その周辺のbundlerには機能として含まれてるものが多い
#WIP
#??
bundler固有の話?
Dead Code Eliminationとそんな変わらない?
tree shkingはその中でも特にimpoet/export関連飲みの話ということ?
どの単位で消す?
関数レベル?
モジュールレベル?
importした上で、その関数を使っていない場合はそのimportも無視される?
JS固有の話?
webpack固有の話?
esm固有の話?
副作用は誰がどのようにして決定するのか
設定ファイルに書くにしても、開発者が手動でやるの怖すぎないか
Webpackのdocs
https://webpack.js.org/guides/tree-shaking/
副作用
WebpackのsideEffects
https://www.kabuku.co.jp/developers/tree-shaking-in-2018
ES6 classの副作用
https://www.kabuku.co.jp/developers/tree-shaking-in-2018
アプリケーション開発者の tree shaking 対応 ref
webpack を利用している場合
4 未満を利用中の場合は、 4 にアップグレードする
UglifyJS を使う場合、 pure_funcs を指定する
package.json で sideEffects を指定することを検討する
webpack、 Rollup 共通
UglifyJS を使う場合、 compress オプションに passes=3 を指定するといいことがあるかも
Babel や TypeScript のようなトランスパイラで、 ES Modules を CommonJS に変換しないよう注意する
TypeScript を使っている場合は、以下のいずれかの方法で ES6 class を tree shaking できるようにする
UglifyJS を使う場合、 /** @class */ を /*@__PURE__*/ に置換する
https://www.kabuku.co.jp/developers/tree-shaking-in-2018
tree shaking概要
ざっくりした仕組みの解説
なぜrequireでは無理なのか、など
具体例
lodashを用いて実際どれぐらいのバンドルサイズの差になるのかの例
https://engineering.linecorp.com/ja/blog/typescript-enum-tree-shaking/
https://qiita.com/soarflat/items/755bbbcd6eb81bd128c4
ESM で Import されないモジュールを削除する機能
webpack と terser が担ってる
rollup なら単体でできる
https://qiita.com/mizchi/items/418be9abee5f785696f0#tree-shaking
ライブラリの中から、importしていない関数たちを削除する漢字科
https://zenn.dev/lidqqq/articles/1ed2ca8a1bb41b3d002d
https://kde.hateblo.jp/entry/2019/02/25/043852#packagejson-%E3%81%AB-sideEffects-%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%92%E6%8C%87%E5%AE%9A
https://developers.google.com/web/fundamentals/performance/optimizing-javascript/tree-shaking
https://qiita.com/soarflat/items/755bbbcd6eb81bd128c4
https://github.com/matteoferigo/nextjs-tree-shaking
ESM を使うことにより、未使用のモジュールを検知しバンドル時に分解する
Tree Shakingではコードが消されない
https://groups.google.com/g/comp.lang.lisp/c/6zpZsWFFW18/m/-z_8hHRAIf4J
案外、Tree Shakingという名前は昔からあり、1990年代のLISPにさかのぼります。
https://javascript.plainenglish.io/deep-dive-into-tree-shaking-ba2e648b8dcb
詳しそう
https://zenn.dev/nissy_dev/articles/how-to-make-tree-shakeable-libraries
tree shaking対応のlibraryを作る